package com.cbianc.structure.bridge

/*
* 桥接（Bridge）模式的定义如下：将抽象与实现分离，使它们可以独立变化。
* 它是用组合关系代替继承关系来实现，从而降低了抽象和实现这两个可变维度的耦合度。
* */
/*
*
* 遵循了里氏替换原则和依赖倒置原则，最终实现了开闭原则，对修改关闭，对扩展开放。这里将桥接模式的优缺点总结如下。

桥接（Bridge）模式的优点是：
    抽象与实现分离，扩展能力强
    符合开闭原则
    符合合成复用原则
    其实现细节对客户透明

缺点是：
    由于聚合关系建立在抽象层，要求开发者针对抽象化进行设计与编程，
    * 能正确地识别出系统中两个独立变化的维度，这增加了系统的理解与设计难度。
*
* */
/*
*
桥接（Bridge）模式包含以下主要角色。
    抽象化（Abstraction）角色：定义抽象类，并包含一个对实现化对象的引用。
    扩展抽象化（Refined Abstraction）角色：是抽象化角色的子类，实现父类中的业务方法，并通过组合关系调用实现化角色中的业务方法。
    实现化（Implementor）角色：定义实现化角色的接口，供扩展抽象化角色调用。
    具体实现化（Concrete Implementor）角色：给出实现化角色接口的具体实现。*/



object BridgeTest {
    @JvmStatic
    fun main(args: Array<String>) {
        val imple: Implementor = ConcreteImplementorA()
        val abs: Abstraction = RefinedAbstraction(imple)
        abs.Operation()
    }
}

//实现化角色
internal interface Implementor {
    fun OperationImpl()
}

//具体实现化角色
internal class ConcreteImplementorA : Implementor {
    override fun OperationImpl() {
        println("具体实现化(Concrete Implementor)角色被访问")
    }
}

//抽象化角色
internal abstract class Abstraction protected constructor(protected var imple: Implementor) {
    abstract fun Operation()
}

//扩展抽象化角色 抽象化角色的子类，实现父类中的业务方法，并通过组合关系调用实现化角色中的业务方法。
internal class RefinedAbstraction(imple: Implementor) : Abstraction(imple) {
    override fun Operation() {
        println("扩展抽象化(Refined Abstraction)角色被访问")
        imple.OperationImpl()
    }
}

/*
*
当一个类内部具备两种或多种变化维度时，使用桥接模式可以解耦这些变化的维度，使高层代码架构稳定。
桥接模式通常适用于以下场景。
    当一个类存在两个独立变化的维度，且这两个维度都需要进行扩展时。
    当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
    当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。

* */